home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks97
/
WarriorsProgress.sit
/
Warrior’s Progress
/
source code
/
Source
/
Libraries
/
Idle
/
Delayer.cp
< prev
next >
Wrap
Text File
|
1997-06-28
|
2KB
|
122 lines
// Delayer.cp
#ifndef Delayer_h
#include "Delayer.h"
#endif
Delayer::Delayer( const Method& method )
: postponer( method ),
when( 0 ),
delayLink( this )
{
Waiting();
}
Delayer::~Delayer()
{
}
Heap<Delayer>& Delayer::Waiting()
{
static Heap<Delayer> waiting( &Delayer::Before );
return waiting;
}
bool Delayer::Before( const Delayer& r ) const
{
Assert( Pending() );
Assert( r.Pending() );
return when <= r.when;
}
void Delayer::DelayBy( uint32 time )
{
// Comparing times doesn't work if
// the times get too far into the future.
Assert( time < maxuint32 / 4 );
DelayTo( Tick::Now() + time );
}
void Delayer::DelayTo( Tick time )
{
Assert( !Pending() )
when = time;
if ( time <= Tick::Now() )
postponer.Schedule();
else
Waiting().Add( delayLink );
}
void Delayer::Cancel()
{
Assert( Pending() );
if ( postponer.Pending() )
postponer.Cancel();
else
Waiting().Remove( delayLink );
}
void Delayer::Hasten()
{
if ( delayLink.Listed() )
{
Waiting().Remove( delayLink );
postponer.Schedule();
}
}
void Delayer::Flush()
{
if ( !Pending() )
return;
Hasten();
postponer.Flush();
}
void Delayer::ScheduleTasks()
{
Tick now( Tick::Now() );
Heap<Delayer>& waiting( Waiting() );
while ( !waiting.IsEmpty() )
{
Delayer& task = *waiting.Top();
if ( task.when > now )
break;
waiting.Remove( task.delayLink );
task.postponer.Schedule();
}
}
uint32 Delayer::SleepTime()
{
if ( !Postponer::CanSleep() )
return 0;
Heap<Delayer>& waiting( Waiting() );
if ( waiting.IsEmpty() )
return maxint32;
Tick nextTime( waiting.Top()->when );
Tick now( Tick::Now() );
if ( nextTime <= now )
return 0;
return nextTime - now;
}
bool Delayer::Pending() const
{
return delayLink.Listed() || postponer.Pending();
}
#include "Heap.cp"
#include "HeapLink.cp"